home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / taropyon / install / item.c < prev    next >
Text File  |  1994-11-16  |  5KB  |  197 lines

  1. /*************************************************************************
  2. *    アイテム登録処理
  3. *************************************************************************/
  4.  
  5. #define    FRM_X1(_frm)    _frm[0]
  6. #define    FRM_Y1(_frm)    _frm[1]
  7. #define    FRM_X2(_frm)    _frm[2]
  8. #define    FRM_Y2(_frm)    _frm[3]
  9.  
  10. int        item_get_newpos( char *pathItem, int fposBase, short *newfrm );
  11. int        item_chkpos( char *pathItem, int fposStart, short *frmchk );
  12. int        item_get_fr( char *pathItem, int fpos, short *fr );
  13. int        item_adjust_pos( short *newfrm );
  14.  
  15. int        item_setApl( int drv, int icon, char *ttl, char *path, char *para, int att )
  16. {
  17.     char    pathItem[64], prog[128];
  18.     short    fr[4];
  19.     int        iconGrp;
  20.     int        fpos;
  21.     char    *ttlGrp;
  22.  
  23.     ttlGrp  = "NEW ITEM";
  24.     iconGrp = 1059;    /* アイコン番号    */
  25.  
  26.     sprintf( pathItem, "%c:\\tmenu.itm", drv + 'A');
  27.     if ( FS_isFile(pathItem) != FSISFILE_FILE )
  28.     {    /* アイテムファイルの作成    */
  29.         ITM_CreateItemFile(pathItem);
  30.     }
  31.  
  32.     /* "天晴"アイテムを検索    --------------------------------------------*/
  33.     FRM_X1(fr) = FRM_Y1(fr) = FRM_X2(fr) = FRM_Y2(fr) = -1;
  34.     fpos = ITM_GetGrpFPos(pathItem,0,-1,-1,ttlGrp,-1,fr);
  35.     if ( fpos < 0 )
  36.     {    /* ルートに天晴アイテムを作成する    */
  37.         item_get_newpos( pathItem, 0, fr);
  38.         if ( (fpos = ITM_AddGrpItem(pathItem,0,iconGrp,ttlGrp,fr)) < 0 )
  39.             return (ERR);
  40.     }
  41.  
  42.     /* アイテムを追加    ------------------------------------------------*/
  43.     if ( item_get_newpos( pathItem, fpos, fr) < 0 )
  44.         return (ERR);
  45.     FS_dosFn(prog,path);
  46.     FS_strupr(prog);
  47.     if ( ITM_AddAplItem( pathItem, fpos, icon, ttl, prog, para, att, fr) < 0 )
  48.         return (ERR);
  49.     return (NORMAL);
  50. }
  51.  
  52.  
  53. int        item_get_newpos( char *pathItem, int fposBase, short *newfrm )
  54. {
  55.     int        area, x, y, x0, y0;
  56.  
  57.     for ( area = 0; area < 9; ++area )
  58.     {
  59.         x = area;
  60.         for ( y = 0; y < area; ++y )
  61.         {
  62.             x0 = x * 64;    FRM_X1(newfrm) = x0+8;    FRM_X2(newfrm) = x0 + 63-8;
  63.             y0 = y * 48;    FRM_Y1(newfrm) = y0+4;    FRM_Y2(newfrm) = y0 + 47-4;
  64.             if ( item_chkpos( pathItem, fposBase, newfrm ) )
  65.                 goto _OK;
  66.         }
  67.         y = area;
  68.         for ( x = 0; x <= area; ++x )
  69.         {
  70.             x0 = x * 64;    FRM_X1(newfrm) = x0+8;    FRM_X2(newfrm) = x0 + 63-8;
  71.             y0 = y * 48;    FRM_Y1(newfrm) = y0+4;    FRM_Y2(newfrm) = y0 + 47-4;
  72.             if ( item_chkpos( pathItem, fposBase, newfrm ) )
  73.                 goto _OK;
  74.         }
  75.     }
  76. _OK:
  77.     x0 = (FRM_X1(newfrm) + FRM_X2(newfrm) + 1) / 2 - 12;
  78.     FRM_X1(newfrm) = (x0+7) & (~7);
  79.     FRM_Y1(newfrm) = FRM_Y1(newfrm) + 4;
  80.     FRM_X2(newfrm) = FRM_X1(newfrm) + 24;
  81.     FRM_Y2(newfrm) = FRM_Y1(newfrm) + 24;
  82. #ifdef    _ITEM_DEBUG
  83.     printf("item_get_newpos fpos:%d, fr:(%03d,%03d)\n", fposBase, (int)(newfrm[0]), (int)(newfrm[1]) );
  84. #endif
  85.  
  86.     return (item_adjust_pos( newfrm ));
  87. }
  88.  
  89. int        item_chkpos( char *pathItem, int fposStart, short *frmchk )
  90. {
  91.     int            ret;
  92.     int            fpos, nextFPos;
  93.     int            etyNum;
  94.     short        icnNum;
  95.     char        ttlStr[128];
  96.     int            atrInf;
  97.     short        frm[4];
  98.     int            numItem;
  99.  
  100. #ifdef    _ITEM_DEBUG
  101.     printf("item_chkpos fpos:%d, fr:(%03d,%03d)\n", fposStart, (int)(frmchk[0]), (int)(frmchk[1]) );
  102.     fflush(stdout);
  103. #endif
  104.  
  105.     if ( (fpos = fposStart) > 0 )
  106.     {
  107.         ret = ITM_GetItmType(pathItem,fpos);
  108.         if ( ret != 1 )        /* グループアイテムではない    */
  109.             return (-1);
  110.         ITM_GetGrpData(pathItem,fpos,&etyNum,&icnNum,ttlStr,&nextFPos,frm);
  111.         /* グループアイテム配下のアイテムをチェック    */
  112. #ifdef    _ITEM_DEBUG
  113.         printf("item num = %d\n", etyNum);    fflush(stdout);
  114. #endif
  115.         while ( etyNum-- > 0 )
  116.         {
  117.             if ( (fpos = ITM_GetPhysclNextFPos( pathItem, fpos )) < 0 )
  118.                 break;    /* error */
  119.             if ( (ret = item_get_fr( pathItem, fpos, frm )) == 0 )
  120.             {
  121.                 if ( FRM_X1(frm) <= FRM_X2(frmchk) && FRM_X2(frm) >= FRM_X1(frmchk) 
  122.                   && FRM_Y1(frm) <= FRM_Y2(frmchk) && FRM_Y2(frm) >= FRM_Y1(frmchk)  )
  123.                     return (0);    /* FALSE    */
  124.             }
  125.         }
  126.     } else
  127.     {    /* ルート    */
  128.         while ( (fpos = ITM_GetPhysclNextFPos( pathItem, fpos )) > 0 )
  129.         {
  130.             if ( ITM_GetStair( pathItem, fpos ) == 0 )
  131.             {
  132.                 if ( (ret = item_get_fr( pathItem, fpos, frm )) == 0 )
  133.                 {
  134.                     if ( FRM_X1(frm) <= FRM_X2(frmchk) && FRM_X2(frm) >= FRM_X1(frmchk) 
  135.                       && FRM_Y1(frm) <= FRM_Y2(frmchk) && FRM_Y2(frm) >= FRM_Y1(frmchk)  )
  136.                         return (0);    /* FALSE    */
  137.                 }
  138.             }
  139.         }
  140.     }
  141.     return (1);    /* OK */
  142. }
  143.  
  144. int        item_get_fr( char *pathItem, int fpos, short *fr )
  145. {
  146.     int            ret;
  147.     int            nextFPos;
  148.     int            etyNum;
  149.     short        icnNum;
  150.     char        ttlStr[128], pathStr[128], paraStr[128];
  151.     int            atrInf;
  152.  
  153. #ifdef    _ITEM_DEBUG
  154.     printf("item_get_fr(fpos;%d)\n", fpos );
  155. #endif
  156.     ret = ITM_GetItmType(pathItem,fpos);
  157. #ifdef    _ITEM_DEBUG
  158.     printf("    item type = %d\n", ret );    fflush(stdout);
  159. #endif
  160.     switch ( ret )
  161.     {
  162.         case 1:    /* group */
  163.             ITM_GetGrpData(pathItem,fpos,&etyNum,&icnNum,ttlStr,&nextFPos,fr);
  164. #ifdef    _ITEM_DEBUG
  165.             printf("    group fr:(%03d,%03d)\n", (int)(fr[0]),(int)(fr[1]));    fflush(stdout);
  166. #endif
  167.             break;
  168.         case 2:    /* apllication */
  169.             ITM_GetAplData(pathItem,fpos,&icnNum,ttlStr,pathStr,paraStr,atrInf,fr);
  170. #ifdef    _ITEM_DEBUG
  171.             printf("    app   fr:(%03d,%03d)\n", (int)(fr[0]),(int)(fr[1]));    fflush(stdout);
  172. #endif
  173.             break;
  174.         case 3:    /* v1.1 group */
  175.             return (-1);
  176.  
  177.         default:
  178.             return (-1);
  179.     }
  180.     return (0);
  181. }
  182.  
  183. int        item_adjust_pos( short *newfrm )
  184. {
  185.     if ( FRM_X2(newfrm) > 621 )
  186.     {
  187.         FRM_X2(newfrm) = 621;
  188.         FRM_X1(newfrm) = FRM_X2(newfrm) - 24;
  189.     }
  190.     if ( FRM_Y2(newfrm) > 410 )
  191.     {
  192.         FRM_Y2(newfrm) = 410;
  193.         FRM_Y1(newfrm) = FRM_Y2(newfrm) - 24;
  194.     }
  195.     return (NORMAL);
  196. }
  197.